package com.example.base_model.heart

/**
 * @Author jiangKunKun
 * @CreateDate 2025/10/1
 * @Description 全局心跳管理器，作为一个单例，用于创建、存储和管理多个心跳控制器实例。
 * 通过这种方式，应用的不同部分可以根据唯一标识符获取各自独立的心跳控制器，
 * 例如一个用于网络连接检查，另一个用于服务器状态轮询。
 * @SpittingGrooves
 */
object GlobalHeartbeatManager {
    /**
     * 存储所有已创建的心跳控制器实例。
     * - **Key**: `String` - 每个心跳控制器的唯一标识符，例如 "network" 或 "server"。
     * - **Value**: `HeartbeatController` - 对应的心跳控制器实例。
     *
     * 使用 Map 可以确保每个标识符只对应一个控制器实例，并能快速检索。
     */
    private val heartbeatControllers = mutableMapOf<String, HeartbeatController>()

    /**
     * 根据给定的标识符，获取或创建一个心跳控制器实例。
     *
     * 这是一个工厂方法，它确保了对于同一个 `identifier`，总是返回相同的 `HeartbeatController` 实例。
     * 如果该 `identifier` 的控制器不存在，它会自动创建一个新的实例并存储起来。
     *
     * @param identifier 心跳控制器的唯一标识符。
     * @return 对应标识符的心跳控制器实例。
     *
     * **用法示例:**
     * ```
     * // 获取用于 websocket 的心跳控制器
     * val wsHeartbeat = GlobalHeartbeatManager.getController("websocket")
     * wsHeartbeat.start {
     *     // 执行心跳任务
     * }
     * ```
     */
    fun getController(identifier: String): HeartbeatController {
        // `getOrPut` 是一个原子操作，它会：
        // 1. 检查 `identifier` 是否已存在于 map 中。
        // 2. 如果存在，直接返回对应的 `HeartbeatController` 实例。
        // 3. 如果不存在，执行 lambda 表达式 `{ HeartbeatController() }` 创建一个新的实例，
        //    然后将这个新实例存入 map，并返回它。
        return heartbeatControllers.getOrPut(identifier) { HeartbeatController() }
    }

    /**
     * 获取专门用于网络状态心跳的控制器。
     * 这是一个便捷属性，等同于 `getController("network")`。
     */
    val networkHeartbeat: HeartbeatController
        get() = getController("network")

    /**
     * 获取专门用于服务器业务心跳的控制器。
     * 这是一个便捷属性，等同于 `getController("server")`。
     */
    val serverHeartbeat: HeartbeatController
        get() = getController("server")
}
